//package com.ly.heart.service.impl;
//
//import java.util.ArrayList;
//import java.util.List;
//
//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
//import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
//
//
//import com.ly.common.core.domain.AjaxResult;
//import com.ly.common.utils.DateUtils;
//import com.ly.common.utils.erp.ConstUtil;
//import com.ly.common.utils.erp.SnowflakeIdWorker;
//import com.ly.heart.domain.InventoryEntity;
//import com.ly.heart.domain.MaterialDetailEntity;
//import com.ly.heart.domain.dto.AddAllocationDto;
//import com.ly.heart.service.IAllocationService;
//import com.ly.heart.service.IInventoryService;
//import com.ly.heart.service.IMaterialDetailService;
//import org.apache.commons.lang3.ObjectUtils;
//import org.apache.commons.lang3.math.NumberUtils;
//import org.springframework.stereotype.Service;
//import com.ly.heart.mapper.AllocationMapper;
//import com.ly.heart.domain.AllocationEntity;
//import org.springframework.transaction.annotation.Transactional;
//
//import javax.annotation.Resource;
//
///**
// * 出入库调拨单Service业务层处理
// *
// * @author wutao
// * @date 2024-06-05
// */
//@Service
//public class AllocationServiceImpl extends ServiceImpl<AllocationMapper, AllocationEntity> implements IAllocationService {
//
//    @Resource
//    private AllocationMapper allocationEntityMapper;
//    @Resource
//    private IMaterialDetailService materialDetailService;
//    @Resource
//    private IInventoryService inventoryService;
//
//    /**
//     * 查询出入库调拨单
//     *
//     * @param id 出入库调拨单ID
//     * @return 出入库调拨单
//     */
//    @Override
//    public AllocationEntity selectAllocationEntityById(String id) {
//        return allocationEntityMapper.selectAllocationEntityById(id);
//    }
//
//    /**
//     * 查询出入库调拨单列表
//     *
//     * @param allocationEntity 出入库调拨单
//     * @return 出入库调拨单
//     */
//    @Override
//    public List<AllocationEntity> selectAllocationEntityList(AllocationEntity allocationEntity) {
//        return allocationEntityMapper.selectAllocationEntityList(allocationEntity);
//    }
//
//    /**
//     * 新增出入库调拨单
//     *
//     * @param allocationDto 出入库调拨单
//     * @return 结果
//     */
//    @Transactional(rollbackFor = Exception.class)
//    public AjaxResult insertAllocationEntity(AddAllocationDto allocationDto) {
//        String id = SnowflakeIdWorker.getInstance().nextStringId();
//        allocationDto.getAllocationEntity().setCreateTime(DateUtils.getNowDate());
//        allocationDto.getAllocationEntity().setId(id);
//
//        int inserted = allocationEntityMapper.insertAllocationEntity(allocationDto.getAllocationEntity());
//        if (inserted <= 0) {
//            // 记录日志并返回具体的错误信息
//            log.error("数据插入失败，请检查数据完整性或数据库连接");
//            return AjaxResult.error("数据插入失败，请检查数据完整性或数据库连接");
//        }
//        // 优化：在循环外部先获取一次ID
//        if (!allocationDto.getMaterialDetailEntityList().isEmpty()) {
//            List<String> ids = new ArrayList<>();
//            for (int i = 0; i < allocationDto.getMaterialDetailEntityList().size(); i++) {
//                ids.add(SnowflakeIdWorker.getInstance().nextStringId());
//            }
//            // 设置关联ID和类型
//            allocationDto.getMaterialDetailEntityList().forEach(s -> {
//                s.setType(ConstUtil.ORDER_ALLOCATION_STORAGE);
//                s.setId(ids.remove(0)); // 避免重复ID
//                s.setRelationId(allocationDto.getAllocationEntity().getId());
//            });
//
//            boolean isMaterialDetailSaved = materialDetailService.saveBatch(allocationDto.getMaterialDetailEntityList());
//            if (isMaterialDetailSaved) {
//                return AjaxResult.success("添加成功");
//            } else {
//                // 如果保存详情失败，也应给出具体错误信息
//                // log.error("保存详情失败");
//                return AjaxResult.error("保存详情失败");
//            }
//        }
//        return AjaxResult.success();
//    }
//
//    /**
//     * 修改出入库调拨单
//     *
//     * @param allocationEntity 出入库调拨单
//     * @return 结果
//     */
//    @Override
//    public int updateAllocationEntity(AllocationEntity allocationEntity) {
//        allocationEntity.setUpdateTime(DateUtils.getNowDate());
//        return allocationEntityMapper.updateAllocationEntity(allocationEntity);
//    }
//
//    /**
//     * 批量删除出入库调拨单
//     *
//     * @param ids 需要删除的出入库调拨单ID
//     * @return 结果
//     */
//    @Override
//    public int deleteAllocationEntityByIds(String[] ids) {
//        return allocationEntityMapper.deleteAllocationEntityByIds(ids);
//    }
//
//    /**
//     * 删除出入库调拨单信息
//     *
//     * @param id 出入库调拨单ID
//     * @return 结果
//     */
//    @Override
//    public int deleteAllocationEntityById(String id) {
//        return allocationEntityMapper.deleteAllocationEntityById(id);
//    }
//
//    /**
//     * 调拨单审核成功后修改库存
//     *      1.添加调拨对应项目的库存
//     *      2.减少被调拨项目的库存
//     * @param allocationEntity
//     * @return
//     */
//
//    @Transactional(rollbackFor = Exception.class)
//    @Override
//    public AjaxResult updateAllocationState(AllocationEntity allocationEntity) {
//        try {
//            allocationEntity.setState("2");
//            int updated = allocationEntityMapper.updateAllocationEntity(allocationEntity);
//            if (updated > 0) {
//                // 调拨单审核成功后修改库存
//                updateInventory(allocationEntity);
//            }
//            return AjaxResult.success("审核成功");
//        } catch (Exception e) {
//            // 这里可以根据具体情况抛出更具体的异常类型
//            log.error("审核失败");
//            return AjaxResult.error("审核失败");
//        }
//    }
//
//   /* @Override
//    public AjaxResult updateAllocationState(AllocationEntity allocationEntity) {
//        allocationEntity.setState("2");
//        int updated = allocationEntityMapper.updateAllocationEntity(allocationEntity);
//        if (updated >0){//调拨单审核成功后修改库存
//            //查询被调的库存
//            List<InventoryEntity> callOutInventoryList = inventoryService.list(new LambdaQueryWrapper<InventoryEntity>()
//                    .eq(InventoryEntity::getProjectId, allocationEntity.getCallOutProject())
//                    .eq(InventoryEntity::getWarehouseId, allocationEntity.getCallOutWarehouse())
//            );
//            //查询调入的库存
//            List<InventoryEntity> callInInventoryList = inventoryService.list(new LambdaQueryWrapper<InventoryEntity>()
//                    .eq(InventoryEntity::getProjectId, allocationEntity.getCallInProject())
//                    .eq(InventoryEntity::getWarehouseId, allocationEntity.getCallInWarehouse())
//            );
//
//            //查询调拨对应的物料明细
//            List<MaterialDetailEntity> list = materialDetailService.list(new LambdaQueryWrapper<MaterialDetailEntity>().eq(MaterialDetailEntity::getRelationId, allocationEntity.getId()));
//            for (MaterialDetailEntity m : list){
//                //查询调出的库存物料是否存在
//                InventoryEntity callOutInventoryEntity = callOutInventoryList.stream().filter(s -> s.getMaterialId().equals(m.getMaterialId())).findFirst().orElse(new InventoryEntity());
//                callOutInventoryEntity.setResidueNumber(String.valueOf(Integer.parseInt(callOutInventoryEntity.getResidueNumber())-m.getNumber()));
//                callOutInventoryEntity.setUseageNumber(String.valueOf(Integer.parseInt(callOutInventoryEntity.getUseageNumber())+m.getNumber()));
//                boolean b = inventoryService.updateById(callOutInventoryEntity);
//                //查询调出入的库存物料是否存在
//                InventoryEntity callInInventoryEntity = callInInventoryList.stream().filter(s -> s.getMaterialId().equals(m.getMaterialId())).findFirst().orElse(new InventoryEntity());
//                if (ObjectUtils.isNotEmpty(callInInventoryEntity)){//存在在原有的基础上加
//                    callInInventoryEntity.setResidueNumber(String.valueOf(Integer.parseInt(callInInventoryEntity.getResidueNumber())+m.getNumber()));
//                    callInInventoryEntity.setInventoryNumber(String.valueOf(Integer.parseInt(callInInventoryEntity.getInventoryNumber())+m.getNumber()));
//                    boolean b1 = inventoryService.updateById(callInInventoryEntity);
//                }else {
//                    callInInventoryEntity.setResidueNumber(String.valueOf(m.getNumber()));
//                    callInInventoryEntity.setInventoryNumber(String.valueOf(m.getNumber()));
//                    callInInventoryEntity.setMaterialId(m.getMaterialId());
//                    callInInventoryEntity.setUseageNumber("0");
//                    callInInventoryEntity.setProjectId(allocationEntity.getCallInProject());
//                    callInInventoryEntity.setWarehouseId(allocationEntity.getCallInWarehouse());
//                    callInInventoryEntity.setWarehouseRegionId(allocationEntity.getCallInWarehouse());
//                    callInInventoryEntity.setInventoryMoney(m.getTaxMoney());
//                    callInInventoryEntity.setId(SnowflakeIdWorker.getInstance().nextStringId());
//                    boolean b1 = inventoryService.save(callInInventoryEntity);
//                }
//            }
//
//            return AjaxResult.success("审核成功");
//        }
//        return null;
//    }*/
//
//
//
//
//
//    private void updateInventory(AllocationEntity allocationEntity) {
//        // 查询被调的库存
//        List<InventoryEntity> callOutInventoryList = inventoryService.list(new LambdaQueryWrapper<InventoryEntity>()
//                .eq(InventoryEntity::getProjectId, allocationEntity.getCallOutProject())
//                .eq(InventoryEntity::getWarehouseId, allocationEntity.getCallOutWarehouse())
//        );
//        // 查询调入的库存
//        List<InventoryEntity> callInInventoryList = inventoryService.list(new LambdaQueryWrapper<InventoryEntity>()
//                .eq(InventoryEntity::getProjectId, allocationEntity.getCallInProject())
//                .eq(InventoryEntity::getWarehouseId, allocationEntity.getCallInWarehouse())
//        );
//
//        // 查询调拨对应的物料明细
//        List<MaterialDetailEntity> list = materialDetailService.list(new LambdaQueryWrapper<MaterialDetailEntity>().eq(MaterialDetailEntity::getRelationId, allocationEntity.getId()));
//        list.forEach(m -> {
//            // 调出的库存物料处理
//            InventoryEntity callOutInventoryEntity = callOutInventoryList.stream()
//                    .filter(s -> s.getMaterialId().equals(m.getMaterialId()))
//                    .findFirst()
//                    .orElseGet(InventoryEntity::new);
//            adjustInventory(callOutInventoryEntity, -Double.parseDouble ( m.getNumber() ), allocationEntity.getCallOutProject(), allocationEntity.getCallOutWarehouse());
//
//            // 调入的库存物料处理
//            InventoryEntity callInInventoryEntity = callInInventoryList.stream()
//                    .filter(s -> s.getMaterialId().equals(m.getMaterialId()))
//                    .findFirst()
//                    .orElseGet(() -> {
//                        InventoryEntity newEntity = new InventoryEntity();
//                        newEntity.setResidueNumber(String.valueOf(m.getNumber()));
//                        newEntity.setInventoryNumber(String.valueOf(m.getNumber()));
//                        newEntity.setMaterialId(m.getMaterialId());
//                        newEntity.setUseageNumber("0");
//                        newEntity.setProjectId(allocationEntity.getCallInProject());
//                        newEntity.setWarehouseId(allocationEntity.getCallInWarehouse());
//                        newEntity.setWarehouseRegionId(allocationEntity.getCallInWarehouse());
//                        newEntity.setInventoryMoney(m.getTaxMoney());
//                        newEntity.setId(SnowflakeIdWorker.getInstance().nextStringId());
//                        return newEntity;
//                    });
//            adjustInventory(callInInventoryEntity, Double.parseDouble ( m.getNumber() ), allocationEntity.getCallInProject(), allocationEntity.getCallInWarehouse());
//        });
//    }
//
//    private void adjustInventory(InventoryEntity inventoryEntity, double adjustNumber, String projectId, String warehouseId) {
//        if (NumberUtils.isParsable(inventoryEntity.getResidueNumber()) && NumberUtils.isParsable(inventoryEntity.getUseageNumber())) {
//            int residueNumber = Integer.parseInt(inventoryEntity.getResidueNumber());
//            int useageNumber = Integer.parseInt(inventoryEntity.getUseageNumber());
//            if (adjustNumber > 0) {
//                residueNumber += adjustNumber;
//                useageNumber -= adjustNumber;
//            } else if (adjustNumber < 0) {
//                residueNumber -= adjustNumber;
//                useageNumber += Math.abs(adjustNumber);
//            }
//            inventoryEntity.setResidueNumber(String.valueOf(residueNumber));
//            inventoryEntity.setUseageNumber(String.valueOf(useageNumber));
//            if (ObjectUtils.isNotEmpty(inventoryEntity.getId())) {
//                inventoryService.updateById(inventoryEntity);
//            } else {
//                inventoryEntity.setProjectId(projectId);
//                inventoryEntity.setWarehouseId(warehouseId);
//                inventoryService.save(inventoryEntity);
//            }
//        }
//    }
//}
